在Nacos的场景中,配置管理的权限控制指的是设置某个配置能否被某个用户读写,这个比较好理解,没有权限的用户旧无法读取或者写入对应的配置。服务发现的权限控制指的是用户是否有权限进行某个服务的注册或者订阅,这里需要注意的是服务发现的权限控制只能够控制用户是否可以从Nacos获取到服务的地址或者在Nacos上修改服务的地址。但是如果已经获取到了服务的地址,Nacos无法在服务真正调用时进行权限控制,这个时候的权限控制需要由服务框架来完成。
### 常见实现方式#### 认证(Authentication)鉴权(Authorization)
- ACL: 规定资源可以被哪些主体进行哪些操作;
- DAC: 规定资源可以被哪些主体进行哪些操作 同时,主体可以将资源的权限,授予其他主体;
- MAC:a. 规定资源可以被哪些类别的主体进行哪些操作 b. 规定主体可以对哪些等级的资源进行哪些操作 当一个操作,同时满足a与b时,允许操作;
- RBAC: a. 规定角色可以对哪些资源进行哪些操作 b. 规定主体拥有哪些角色当一个操作,同时满足a与b时,允许操作;
- ABAC: 规定哪些属性的主体可以对哪些属性的资源在哪些属性的情况下进行哪些操作。
- 创建用户:POST
/nacos/v1/auth/users?username=xx&password=yy - 删除用户:DELETE /nacos/v1/auth/users?username=xx&password=yy
- 更新用户:PUT /nacos/v1/auth/users?username=xx&oldPassword=yy&newPassword=zz
- 登录:POST
/nacos/v1/auth/users/login?username=xxx&password=yyy
- 创建角色/绑定用户到角色:POST /nacos/v1/auth/roles?role=xx&username=yy
- 删除某个用户的角色:DELETE /nacos/v1/auth/roles?role=xx&username=yy
- 获取用户的所有角色:GET /nacos/v1/auth/roles?username=xxx
- 给角色添加权限:POST /nacos/v1/auth/permissions?role=xxx&resource=yyy&action=zzz
- 从角色删除权限:DELETE /nacos/v1/auth/permissions?role=xxx&resource=yyy&action=zzz
- 获取某个角色的权限:GET /nacos/v1/auth/permissions?role=xxx
- 部署包准备。可以直接下载安装包:https://github.com/alibaba/nacos/releases/tag/1.2.0,也可以将Nacos master分支clone下来进行源码编译:
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
- 安装包解压,然后使用distribution/nacos-mysql.sql进行数据库初始化,主要是新增了users, roles, permissions三张表,standalone模式使用distribution/schema.sql进行初始化。
- Server端打开权限控制开关。修改con/application.properties内容:
nacos.core.auth.enabled=true
这个开关采用了热加载模式,无需重启Server即可生效。因此当权限控制功能使用有异常时,可以直接回滚到不鉴权的模式。
注意: Nacos 1.2.0里登录和鉴权是绑定关系,而由于这个开关的默认值为false,因此默认启动时,是没有登录界面的,这点请读者注意。
## 使用权限控制- 使用管理员账号登录Nacos控制台(如果页面提示错误,可以清空浏览器缓存刷新页面):
可以看到,左侧边栏增加了一个父菜单和三个子菜单,分别用于权限控制里的用户创建、角色创建以及权限管 理。这个菜单栏只会在管理员登录的时候显示,也就意味着只有管理员才能进行权限的管理和分配。
- 管理用户。点击“用户列表”,进入用户管理页面,可以进行用户的创建、修改和删除:
- 管理角色。因为Nacos的自带的权限是基于角色来进行分配的,因此需要给创建好的用户绑定一些角色:
- 管理权限。角色创建好以后,就可以给这个角色赋予特定的权限了:
在“添加资源”对话框里,可以选择绑定的角色,命名空间资源以及对应的动作类型,例如在上图中,我们给角色role1绑定命名空间test的读写权限。然后又因为刚刚我们是将user1绑定到了role1上,那么user1这个用户就可以对test这个命名空间的资源进行读写操作了。
- 使用user1登录控制台。点击控制台右上角,退出admin账号,然后用刚才创建的user1进行登录:
如上图所示,首先是左侧的权限管理菜单消失了,因为当前用户不是管理员。其次是会弹出一个鉴权失败的提示框。不用担心,这个提示框意思是user1没有public命名空间的读权限,所以会弹出,但是不影响我们将命名空间切换到test:
如上图所示,我们可以看到test命名空间的配置数据了,下面我们再来介绍客户端的使用。
- 首先依赖最新的nacos 1.2.0客户端,然后在初始化时添加如下代码:
Properties properties = new Properties();
properties.put(PropertyKeyConst.NAMESPACE, "99a791cf-41c4-4535-9e93-b0141652bad0");
properties.put(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848");
// 配置用户名:
properties.put(PropertyKeyConst.USERNAME, "user1");
// 配置密码:
properties.put(PropertyKeyConst.PASSWORD, "pwd1");
ConfigService iconfig = NacosFactory.createConfigService(properties);
- 使用客户端进行正常的读写配置操作。